package visiopuce.service.document;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.apache.velocity.util.StringUtils;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Analyse;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Phenotype;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.UtilisateurServiceImpl;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class ResultatCaryo {

	public String createDocument(Resultat r) {
		String nomFichierout = "";
		try {
			boolean creer = true;
			InputStream in = new FileInputStream(new File(ApplicationContexte.REPERTOIRE_MODEL + "resulatCaryo.docx"));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);
			Analyse analyse = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(r.getAnalyse().getIdAnalyse());
			Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(analyse.getPrelevement().getIdPrelevement());
			Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());
			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
			String repResultat = "";
			String typeAnalyse = "";
			String resolution = "";
			if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(1))) {
				repResultat = ApplicationContexte.REPERTOIRE_RESULTAT + "activité 20" + prelevement.getNumeroPrelevement().substring(1, 3) + "\\" + prelevement.getNumeroPrelevement().substring(0, 1) + "\\";
			} else {
				if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(2))) {
					repResultat = ApplicationContexte.REPERTOIRE_RESULTAT + "activité 20" + prelevement.getNumeroPrelevement().substring(2, 4) + "\\" + prelevement.getNumeroPrelevement().substring(0, 2) + "\\";
				}
			}

			// 2) Create Java model context
			IContext context = report.createContext();

			String titrePersonne = "";
			if (personne.getSexe().equals("M")) {
				titrePersonne = "Monsieur";
			} else if (personne.getSexe().equals("F")) {
				titrePersonne = "Madame";
			}

			context.put("titrePersonne", titrePersonne);
			personne.setPrenom(StringUtils.capitalizeFirstLetter(personne.getPrenom().toLowerCase()));
			context.put("personne", personne);
			context.put("dateNaissance", formatter.format(personne.getDateNaissance()));
			context.put("dateRendu", formatter.format(new Date()));
			if (prelevement.getDateReception() == null) {
				context.put("dateReception", formatter.format(prelevement.getDatePrelevement()));
			} else {
				context.put("dateReception", formatter.format(prelevement.getDateReception()));
			}
			String oldtp = prelevement.getTypePrelevement().getLibelle();
			if (prelevement.getTypePrelevement().getLibelle().equals("Culture de Liquide Amniotique") || prelevement.getTypePrelevement().getLibelle().equals("Liquide Amniotique natif")) {
				prelevement.getTypePrelevement().setLibelle("Liquide Amniotique");
			}
			if (prelevement.getTypePrelevement().getLibelle().equals("Culture de Villosités choriales") || prelevement.getTypePrelevement().getLibelle().equals("Villosités choriales natif")) {
				prelevement.getTypePrelevement().setLibelle("Villosités choriales");
			}
			String indication = "";
			if (prelevement.getIndication() == null || prelevement.getIndication().getLibelle().equals("non renseigné")) {
				indication = "L'INDICATION N'A PAS ETE ENTREE";
			} else {
				if (!prelevement.getIndication().getLibelle().contains("utre")) {
					indication = prelevement.getIndication().getLibelle() + " - ";
				}
				Champ ctSigneAppel = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSigneAppel", "Prel-" + prelevement.getIdPrelevement());
				if (prelevement.getIndication().getLibelle().contains("ignes d'appel")) {
					if (ctSigneAppel != null) {
						indication = "Signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
					}
				} else {
					if (ctSigneAppel != null) {
						indication += "signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
					}
				}
				if (personne.getPhenotype() != null) {
					indication += personne.getPhenotype() + " - ";
				}
				ArrayList<Phenotype> pheno = PersonneServiceImpl.getInstance().getPhenotypesByIdPersonne(personne.getIdPersonne());
				if (pheno != null) {
					for (Phenotype phenotype : pheno) {
						if (!indication.toLowerCase().contains(phenotype.getLibelle().toLowerCase())) {
							indication += phenotype.getLibelle() + " - ";
						}
					}
				}

			}
			if (prelevement.getInfoIndication() != null && !prelevement.getInfoIndication().isEmpty()) {
				indication += prelevement.getInfoIndication();
			}
			context.put("indication", indication.substring(0, indication.length() - 3) + ".");
			context.put("prelevement", prelevement);
			context.put("resultat", r);
			context.put("analyse", analyse);

			Champ ctResolutionCaryo = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tResolutionCaryo", "Ana-" + analyse.getIdAnalyse());
			if (ctResolutionCaryo != null) {
				resolution = ctResolutionCaryo.getValeur();
			} else {
				resolution = "à compléter";
			}

			context.put("signataire", r.getSignataire());

			Champ cbtnMarquage = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("btnMarquage", "Ana-" + analyse.getIdAnalyse());
			String marquage = "";
			if (cbtnMarquage != null) {
				String[] btns = cbtnMarquage.getValeur().split("\\|");
				for (int i = 0; i < btns.length; i++) {
					if (btns[i] != null && !btns[i].isEmpty()) {
						marquage += btns[i] + " et ";
					}
				}
			}
			if (marquage.length() > 4) {
				context.put("marquage", marquage.substring(0, marquage.length() - 4));
			} else {
				context.put("marquage", "à compléter");
			}

			Champ ctMitosesClassees = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tMitosesClassees", "Ana-" + analyse.getIdAnalyse());
			if (ctMitosesClassees != null) {
				context.put("mitosesClassees", ctMitosesClassees.getValeur());
			} else {
				context.put("mitosesClassees", "à compléter");
			}
			String mitosesCaptees = "";
			Champ ctMitosesExaminees = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tMitosesExaminees", "Ana-" + analyse.getIdAnalyse());
			if (ctMitosesExaminees != null) {
				mitosesCaptees = ctMitosesExaminees.getValeur();
			} else {
				mitosesCaptees = "à compléter";
			}

			if (prelevement.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PRENATAL)) {
				context.put("secteur", "PRENATALE");
				context.put("cultSynchro", "\r\n");
				if (prelevement.getNumeroPrelevement().contains("LA")) {
					mitosesCaptees += " mitoses examinées provenant de ";
					Champ ctColonies = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tColonies", "Ana-" + analyse.getIdAnalyse());
					if (ctColonies != null) {
						mitosesCaptees += ctColonies.getValeur();
					} else {
						mitosesCaptees += "XXX";
					}
					mitosesCaptees += " colonies";

					Champ ctChambresCultures = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tChambresCultures", "Ana-" + analyse.getIdAnalyse());
					if (ctChambresCultures != null) {
						mitosesCaptees += "\r\nNombre de chambres de cultures\t:\t" + ctChambresCultures.getValeur();
					} else {
						mitosesCaptees += "\r\nNombre de chambres de cultures\t:\tà compléter";
					}
					typeAnalyse = "RESULTAT CARYOTYPE";
				}
				if (analyse.getTypeAnalyse().getLibelle().equals("aneuvysion")) {
					context.put("typeAnalyse", "RESULTAT D'ANEUVYSION");
				} else {
					if (prelevement.getNumeroPrelevement().contains("VC")) {
						if (analyse.getTypeAnalyse().getLibelle().equals("caryotype")) {
							typeAnalyse = "ETUDE APRES CULTURE DE L'AXE MESENCHYMATEUX VILLOSITAIRE";
							Champ ctChambresCultures = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tChambresCultures", "Ana-" + analyse.getIdAnalyse());
							if (ctChambresCultures != null) {
								resolution += "\r\nNombre de cultures\t:\t" + ctChambresCultures.getValeur();
							} else {
								resolution += "\r\nNombre de cultures\t:\tà compléter";
							}

						} else if (analyse.getTypeAnalyse().getLibelle().equals("caryotype en examen direct")) {
							typeAnalyse = "ETUDE APRES EXAMEN DIRECT DU CYTOTROPHOBLASTE";
						} else if (analyse.getTypeAnalyse().getLibelle().equals("caryotype en examen direct + culture")) {
							typeAnalyse = "ETUDE APRES EXAMEN DIRECT DU CYTOTROPHOBLASTE ET CULTURE DE L'AXE MESENCHYMATEUX";
							Champ ctChambresCultures = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tChambresCultures", "Ana-" + analyse.getIdAnalyse());
							if (ctChambresCultures != null) {
								resolution += "\r\nNombre de cultures\t:\t" + ctChambresCultures.getValeur();
							} else {
								resolution += "\r\nNombre de cultures\t:\tà compléter";
							}
							mitosesCaptees += " mitoses examinées dont\r\n";
							Champ ctApresED = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tNbApresED", "Ana-" + analyse.getIdAnalyse());
							if (ctApresED != null) {
								mitosesCaptees += "\t\t" + ctApresED.getValeur();
							} else {
								mitosesCaptees += "\t\tXXX";
							}
							mitosesCaptees += " après examen direct\r\n";
							Champ ctApresCult = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tNbApresCult", "Ana-" + analyse.getIdAnalyse());
							if (ctApresCult != null) {
								mitosesCaptees += "\t\t" + ctApresCult.getValeur();
							} else {
								mitosesCaptees += "\t\tXXX";
							}
							mitosesCaptees += " après culture\r\n";
						}
					}
				}
				
			} else {
				context.put("secteur", "CONSTITUTIONNELLE POSTNATALE");
				context.put("cultSynchro", "\r\nCulture synchronisées\t: Synchroset Euroclone");
				typeAnalyse = "RESULTAT CARYOTYPE";
			}

			context.put("typeAnalyse", typeAnalyse);

			context.put("mitosesCaptees", mitosesCaptees);
			context.put("resolution", resolution);
			String prescripteur = "";
			String prescripteur2 = "";
			if (prelevement.getPrescripteur() != null) {
				if (!prelevement.getPrescripteur().getNom().equals("CPDPN")) {
					prescripteur += prelevement.getPrescripteur().getTitre() + " " + prelevement.getPrescripteur().getPrenom() + " " + prelevement.getPrescripteur().getNom() + "\r\n";
				}
				prescripteur += prelevement.getPrescripteur().getAdresse() + "\r\n";
				prescripteur2 += prelevement.getPrescripteur().getTitre() + " " + prelevement.getPrescripteur().getPrenom() + " " + prelevement.getPrescripteur().getNom() + " ";

			}
			if (prelevement.getPrescripteur2() != null) {
				if (!prelevement.getPrescripteur2().getNom().equals("CPDPN")) {
				prescripteur += prelevement.getPrescripteur2().getTitre() + " " + prelevement.getPrescripteur2().getPrenom() + " " + prelevement.getPrescripteur2().getNom() + "\r\n";
				}
				prescripteur += prelevement.getPrescripteur2().getAdresse() + "\r\n";
				prescripteur2 += prelevement.getPrescripteur2().getTitre() + " " + prelevement.getPrescripteur2().getPrenom() + " " + prelevement.getPrescripteur2().getNom() + " ";

			}
			if (prelevement.getPrescripteur3() != null) {
				if (!prelevement.getPrescripteur3().getNom().equals("CPDPN")) {
				prescripteur += prelevement.getPrescripteur3().getTitre() + " " + prelevement.getPrescripteur3().getPrenom() + " " + prelevement.getPrescripteur3().getNom() + "\r\n";
				}
				prescripteur += prelevement.getPrescripteur3().getAdresse() + "\r\n";
				prescripteur2 += prelevement.getPrescripteur3().getTitre() + " " + prelevement.getPrescripteur3().getPrenom() + " " + prelevement.getPrescripteur3().getNom() + " ";
			}
			if (prelevement.getNomPrenomAutrePresc() != null && !prelevement.getNomPrenomAutrePresc().isEmpty()) {
				prescripteur += prelevement.getNomPrenomAutrePresc() + "\r\n";
				prescripteur2 += prelevement.getNomPrenomAutrePresc() + " ";
			}
			prescripteur2 += "\r\n";
			if (prelevement.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PRENATAL)) {
				Champ ctPonc = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("comboPonctionneur", "Prel-" + prelevement.getIdPrelevement());
				Utilisateur ponctionneur = null;
				if (ctPonc != null) {
					ponctionneur = UtilisateurServiceImpl.getInstance().getUtilisateurById(Integer.parseInt(ctPonc.getValeur()));
				}
				if (ponctionneur != null) {
					prescripteur2 += "Médecin ponctionneur\t:  " + ponctionneur.getTitre() + " " + ponctionneur.getPrenom() + " " + ponctionneur.getNom();
				} else {
					prescripteur2 += "Médecin ponctionneur\t: à compléter";
				}
			}
			context.put("prescripteur", prescripteur);

			context.put("prescripteur2", prescripteur2);

			boolean creer3 = true;
			File fileout3 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_caryo" + r.getAnalyse().getIdAnalyse() + "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + ".docx");
			if (fileout3.exists()) {
				creer3 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout3.getName() + " existe déjà souhaitez vous l'écraser?");
			}
			if (creer3) {
				fileout3.setWritable(true);
				OutputStream out3 = new FileOutputStream(fileout3);
				report.process(context, out3);
				if (fileout3.exists()) {
					nomFichierout += fileout3.getName() + "#";
				}
			}

			if (oldtp != null) {
				prelevement.getTypePrelevement().setLibelle(oldtp);
			}
			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XDocReportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nomFichierout;
	}
}
